/**
 *
 */
package com.rexzhaolei.fizzbuzzwhizz;

/**
 * @author rex.zhao
 *
 */
public abstract class Zz {
	private Zz zz = null;
	private int sp = -1;

	public Zz(int sp) {
		if (sp <= 0 && sp > 9) {
			throw new IllegalArgumentException();
		}
		this.sp = sp;
	}

	public Zz(int sp, Zz zz) {
		this(sp);
		this.zz = zz;
	}

    /**
     * 报告消息
     */
	public String message(int no) {
		String strNo = String.valueOf(no);
		if (no <= 0) {
			return strNo;
		}
		String myMessage = myMessage(no);
		if (zz != null) {
			String mesage = zz.message(no);
			if (strNo.equals(mesage)) {
				// 报的是数字
				if (strNo.equals(myMessage)) {
					// 我报的也是数字
					return strNo;
				} else {
					// 我报的是特殊语句
					return myMessage;
				}
			} else {
				// 报的是数字
				if (strNo.equals(myMessage)) {
					// 我报的是数字
					return mesage;
				} else {
					// 我报的是特殊语句
					return myMessage + mesage;
				}
			}
		} else {
			return myMessage;
		}
	}

	protected String myMessage(int no) {
		if (no % sp == 0) {
			return say();
		} else {
			return String.valueOf(no);
		}
	}

	protected abstract String say();

	public int getSp() {
		return sp;
	}

}
